home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Audio, Video & Photo / Audacity 1.3.5 / audacity-win-unicode-1.3.5.exe / {app} / Plug-Ins / rissetdrum.ny < prev    next >
Lisp/Scheme  |  2008-02-04  |  2KB  |  125 lines

  1. ;nyquist plug-in
  2.  
  3. ;version 3
  4.  
  5. ;type generate
  6.  
  7. ;name "Risset Drum..."
  8.  
  9. ;action "Generating Risset Drum..."
  10.  
  11. ;info "Risset Drum generator by Steven Jones, after Jean Claude Risset\nReleased under terms of the GNU General Public License version 2\nProduces a realistic drum sound consisting of three components;\na sine wave ring-modulated by narrow band noise, an enharmonic\ntone, and a relatively strong sine wave at the fundamental"
  12.  
  13.  
  14.  
  15. ;control frq "Frequency [Hz]" real "" 100 50 2000
  16.  
  17. ;control decay "Decay [seconds]" real "" 2 0.125 10
  18.  
  19. ;control cf "Center frequency of noise [Hz]" real "" 500 100 5000
  20.  
  21. ;control bw "Width of noise band [Hz]" real "" 400 10 1000
  22.  
  23. ;control noise "Amount of noise in mix [percent]" real "" 50 0 100
  24.  
  25.  
  26.  
  27. (if (not (boundp '*rdrum-wtabsize*))
  28.  
  29.     (progn
  30.  
  31.       (setq *rdrum-wtabsize*  2048)
  32.  
  33.       (setq *rdrum-wtab* 
  34.  
  35.      (list (sum
  36.  
  37.           (scale 1.00 (build-harmonic 10 *rdrum-wtabsize*))
  38.  
  39.           (scale 1.50 (build-harmonic 16 *rdrum-wtabsize*))
  40.  
  41.           (scale 2.00 (build-harmonic 22 *rdrum-wtabsize*))
  42.  
  43.           (scale 1.50 (build-harmonic 23 *rdrum-wtabsize*)))
  44.  
  45.              (hz-to-step 1) t))))
  46.  
  47.  
  48.  
  49.  
  50.  
  51. (defun log2 (n)
  52.  
  53.   (/ (log (float n))(log 2.0)))
  54.  
  55.  
  56.  
  57.  
  58.  
  59. (defun percussion (decay)
  60.  
  61.   (let* ((half-life (expt 2.0 (- (log2 decay) 3))))
  62.  
  63.     (exp-dec 0 half-life decay)))
  64.  
  65.  
  66.  
  67.  
  68.  
  69. (defun pink (dur cutoff)
  70.  
  71.   (lowpass6 (noise dur) cutoff))
  72.  
  73.   
  74.  
  75.  
  76.  
  77. (defun risset-drum (frq decay cf bw noise)
  78.  
  79.   (let* ((decay2 (* decay 0.50))
  80.  
  81.       (pitch1 (hz-to-step frq))
  82.  
  83.       (pitch2 (hz-to-step (* frq 0.10)))
  84.  
  85.       (noise-mix  (float (min (max (/ noise 100) 0) 1)))
  86.  
  87.       (tone-mix   (- 1 noise-mix)))
  88.  
  89.     (sum (mult 
  90.  
  91.        (sum (scale noise-mix 
  92.  
  93.                (mult (sine (hz-to-step cf) decay2)
  94.  
  95.                      (pink decay2 bw)))
  96.  
  97.             (scale (* tone-mix 0.17)
  98.  
  99.                       (osc pitch2 decay2 *rdrum-wtab*)))
  100.  
  101.        (percussion decay2))
  102.  
  103.       (mult (scale tone-mix (sine pitch1 decay))
  104.  
  105.                (percussion decay)))))
  106.  
  107.       
  108.  
  109.  
  110.  
  111. ;; Generate signal and normalize.
  112.  
  113. ;; ISSUE: Is there any way to normalize signal without 
  114.  
  115. ;; generating it twice?
  116.  
  117. ;;
  118.  
  119. (setf peakval (peak (risset-drum frq decay cf bw (/ noise 100))
  120.  
  121. ny:all))
  122.  
  123. (scale (/ 0.8 peakval)(risset-drum frq decay cf bw (/ noise 100)))
  124.  
  125.